package com.cencat.order.service;

import com.baomidou.mybatisplus.core.metadata.IPage;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.IService;
import com.cencat.order.dto.MerchantDTO;
import com.cencat.order.entity.Merchant;
import com.cencat.order.vo.MerchantVO;

import java.math.BigDecimal;
import java.time.LocalDateTime;
import java.time.LocalTime;
import java.util.List;
import java.util.Map;

/**
 * 商家业务逻辑接口
 * 
 * @author cencat
 * @date 2024-01-20
 */
public interface MerchantService extends IService<Merchant> {

    /**
     * 分页查询商家列表
     *
     * @param page 分页参数
     * @param merchantCode 商家编号(模糊查询)
     * @param merchantName 商家名称(模糊查询)
     * @param merchantType 商家类型
     * @param businessCategory 业务类别
     * @param merchantStatus 商家状态
     * @param certificationStatus 认证状态
     * @param province 省份
     * @param city 城市
     * @param district 区县
     * @param startTime 创建开始时间
     * @param endTime 创建结束时间
     * @return 商家分页列表
     */
    IPage<MerchantVO> getMerchantPage(Page<MerchantVO> page,
                                     String merchantCode,
                                     String merchantName,
                                     String merchantType,
                                     String businessCategory,
                                     Integer merchantStatus,
                                     Integer certificationStatus,
                                     String province,
                                     String city,
                                     String district,
                                     LocalDateTime startTime,
                                     LocalDateTime endTime);

    /**
     * 根据商家编号查询商家信息
     *
     * @param merchantCode 商家编号
     * @return 商家信息
     */
    MerchantVO getByMerchantCode(String merchantCode);

    /**
     * 根据商家名称查询商家信息
     *
     * @param merchantName 商家名称
     * @return 商家信息
     */
    MerchantVO getByMerchantName(String merchantName);

    /**
     * 根据联系电话查询商家信息
     *
     * @param contactPhone 联系电话
     * @return 商家信息
     */
    MerchantVO getByContactPhone(String contactPhone);

    /**
     * 根据营业执照号查询商家信息
     *
     * @param businessLicense 营业执照号
     * @return 商家信息
     */
    MerchantVO getByBusinessLicense(String businessLicense);

    /**
     * 根据统一社会信用代码查询商家信息
     *
     * @param socialCreditCode 统一社会信用代码
     * @return 商家信息
     */
    MerchantVO getBySocialCreditCode(String socialCreditCode);

    /**
     * 根据区域查询商家列表
     *
     * @param province 省份
     * @param city 城市
     * @param district 区县
     * @param merchantStatus 商家状态
     * @return 商家列表
     */
    List<MerchantVO> getByRegion(String province,
                                String city,
                                String district,
                                Integer merchantStatus);

    /**
     * 根据商家类型查询商家列表
     *
     * @param merchantType 商家类型
     * @param merchantStatus 商家状态
     * @param limit 查询数量限制
     * @return 商家列表
     */
    List<MerchantVO> getByMerchantType(String merchantType,
                                      Integer merchantStatus,
                                      Integer limit);

    /**
     * 根据业务类别查询商家列表
     *
     * @param businessCategory 业务类别
     * @param merchantStatus 商家状态
     * @param limit 查询数量限制
     * @return 商家列表
     */
    List<MerchantVO> getByBusinessCategory(String businessCategory,
                                          Integer merchantStatus,
                                          Integer limit);

    /**
     * 查询商家统计信息
     *
     * @param merchantType 商家类型
     * @param businessCategory 业务类别
     * @param province 省份
     * @param city 城市
     * @param startTime 统计开始时间
     * @param endTime 统计结束时间
     * @return 统计信息
     */
    Map<String, Object> getMerchantStatistics(String merchantType,
                                             String businessCategory,
                                             String province,
                                             String city,
                                             LocalDateTime startTime,
                                             LocalDateTime endTime);

    /**
     * 创建商家信息
     *
     * @param merchantDTO 商家数据传输对象
     * @return 创建结果
     */
    boolean createMerchant(MerchantDTO merchantDTO);

    /**
     * 更新商家信息
     *
     * @param merchantId 商家ID
     * @param merchantDTO 商家数据传输对象
     * @return 更新结果
     */
    boolean updateMerchant(Long merchantId, MerchantDTO merchantDTO);

    /**
     * 商家注册
     *
     * @param merchantDTO 商家注册信息
     * @param verificationCode 验证码
     * @return 注册结果
     */
    Map<String, Object> registerMerchant(MerchantDTO merchantDTO, String verificationCode);

    /**
     * 商家认证申请
     *
     * @param merchantId 商家ID
     * @param certificationData 认证资料
     * @return 申请结果
     */
    boolean applyCertification(Long merchantId, Map<String, Object> certificationData);

    /**
     * 商家认证审核
     *
     * @param merchantId 商家ID
     * @param certificationStatus 认证状态
     * @param auditRemark 审核备注
     * @param auditTime 审核时间
     * @param auditorId 审核员ID
     * @return 审核结果
     */
    boolean auditCertification(Long merchantId,
                              Integer certificationStatus,
                              String auditRemark,
                              LocalDateTime auditTime,
                              Long auditorId);

    /**
     * 更新商家状态
     *
     * @param merchantId 商家ID
     * @param merchantStatus 商家状态
     * @param statusRemark 状态备注
     * @return 更新结果
     */
    boolean updateMerchantStatus(Long merchantId,
                                Integer merchantStatus,
                                String statusRemark);

    /**
     * 更新认证状态
     *
     * @param merchantId 商家ID
     * @param certificationStatus 认证状态
     * @param certificationRemark 认证备注
     * @return 更新结果
     */
    boolean updateCertificationStatus(Long merchantId,
                                     Integer certificationStatus,
                                     String certificationRemark);

    /**
     * 更新营业时间
     *
     * @param merchantId 商家ID
     * @param businessStartTime 营业开始时间
     * @param businessEndTime 营业结束时间
     * @param businessDays 营业日期
     * @param specialBusinessHours 特殊营业时间
     * @return 更新结果
     */
    boolean updateBusinessHours(Long merchantId,
                               LocalTime businessStartTime,
                               LocalTime businessEndTime,
                               String businessDays,
                               String specialBusinessHours);

    /**
     * 更新联系信息
     *
     * @param merchantId 商家ID
     * @param contactPerson 联系人
     * @param contactPhone 联系电话
     * @param contactEmail 联系邮箱
     * @param emergencyContact 紧急联系人
     * @param emergencyPhone 紧急联系电话
     * @return 更新结果
     */
    boolean updateContactInfo(Long merchantId,
                             String contactPerson,
                             String contactPhone,
                             String contactEmail,
                             String emergencyContact,
                             String emergencyPhone);

    /**
     * 更新地址信息
     *
     * @param merchantId 商家ID
     * @param province 省份
     * @param city 城市
     * @param district 区县
     * @param detailAddress 详细地址
     * @param latitude 纬度
     * @param longitude 经度
     * @param addressType 地址类型
     * @return 更新结果
     */
    boolean updateAddressInfo(Long merchantId,
                             String province,
                             String city,
                             String district,
                             String detailAddress,
                             BigDecimal latitude,
                             BigDecimal longitude,
                             String addressType);

    /**
     * 更新配送设置
     *
     * @param merchantId 商家ID
     * @param deliveryRadius 配送半径
     * @param minOrderAmount 最小起送金额
     * @param deliveryFee 配送费
     * @param freeDeliveryAmount 免配送费金额
     * @param deliveryTimeSlots 配送时间段
     * @param specialDeliveryRules 特殊配送规则
     * @return 更新结果
     */
    boolean updateDeliverySettings(Long merchantId,
                                  BigDecimal deliveryRadius,
                                  BigDecimal minOrderAmount,
                                  BigDecimal deliveryFee,
                                  BigDecimal freeDeliveryAmount,
                                  String deliveryTimeSlots,
                                  String specialDeliveryRules);

    /**
     * 批量更新商家状态
     *
     * @param merchantIds 商家ID列表
     * @param merchantStatus 商家状态
     * @return 更新结果
     */
    boolean batchUpdateMerchantStatus(List<Long> merchantIds, Integer merchantStatus);

    /**
     * 批量更新认证状态
     *
     * @param merchantIds 商家ID列表
     * @param certificationStatus 认证状态
     * @return 更新结果
     */
    boolean batchUpdateCertificationStatus(List<Long> merchantIds, Integer certificationStatus);

    /**
     * 商家信用评估
     *
     * @param merchantId 商家ID
     * @param assessmentPeriod 评估周期
     * @param assessmentCriteria 评估标准
     * @return 信用评估结果
     */
    Map<String, Object> assessMerchantCredit(Long merchantId,
                                            Map<String, LocalDateTime> assessmentPeriod,
                                            List<String> assessmentCriteria);

    /**
     * 商家业务分析
     *
     * @param merchantId 商家ID
     * @param analysisPeriod 分析周期
     * @param analysisMetrics 分析指标
     * @return 业务分析结果
     */
    Map<String, Object> analyzeMerchantBusiness(Long merchantId,
                                               Map<String, LocalDateTime> analysisPeriod,
                                               List<String> analysisMetrics);

    /**
     * 商家服务质量评估
     *
     * @param merchantId 商家ID
     * @param evaluationPeriod 评估周期
     * @param qualityMetrics 质量指标
     * @return 服务质量评估结果
     */
    Map<String, Object> evaluateServiceQuality(Long merchantId,
                                              Map<String, LocalDateTime> evaluationPeriod,
                                              List<String> qualityMetrics);

    /**
     * 商家满意度统计
     *
     * @param merchantId 商家ID
     * @param statisticsPeriod 统计周期
     * @param satisfactionDimensions 满意度维度
     * @return 满意度统计结果
     */
    Map<String, Object> getMerchantSatisfactionStatistics(Long merchantId,
                                                          Map<String, LocalDateTime> statisticsPeriod,
                                                          List<String> satisfactionDimensions);

    /**
     * 商家竞争力分析
     *
     * @param merchantId 商家ID
     * @param competitorIds 竞争对手ID列表
     * @param analysisFactors 分析因素
     * @return 竞争力分析结果
     */
    Map<String, Object> analyzeCompetitiveness(Long merchantId,
                                              List<Long> competitorIds,
                                              List<String> analysisFactors);

    /**
     * 商家推荐算法
     *
     * @param customerId 客户ID
     * @param customerLocation 客户位置
     * @param orderPreferences 订单偏好
     * @param recommendationCount 推荐数量
     * @return 推荐商家列表
     */
    List<Map<String, Object>> recommendMerchants(Long customerId,
                                                Map<String, BigDecimal> customerLocation,
                                                Map<String, Object> orderPreferences,
                                                Integer recommendationCount);

    /**
     * 商家热度排行
     *
     * @param rankingPeriod 排行周期
     * @param rankingCriteria 排行标准
     * @param regionFilter 区域过滤
     * @param topCount 排行数量
     * @return 热度排行结果
     */
    List<Map<String, Object>> getMerchantPopularityRanking(Map<String, LocalDateTime> rankingPeriod,
                                                          List<String> rankingCriteria,
                                                          Map<String, String> regionFilter,
                                                          Integer topCount);

    /**
     * 商家收入统计
     *
     * @param merchantId 商家ID
     * @param statisticsPeriod 统计周期
     * @param revenueTypes 收入类型
     * @return 收入统计结果
     */
    Map<String, Object> getMerchantRevenueStatistics(Long merchantId,
                                                     Map<String, LocalDateTime> statisticsPeriod,
                                                     List<String> revenueTypes);

    /**
     * 商家成本分析
     *
     * @param merchantId 商家ID
     * @param analysisPeriod 分析周期
     * @param costCategories 成本类别
     * @return 成本分析结果
     */
    Map<String, Object> analyzeMerchantCost(Long merchantId,
                                           Map<String, LocalDateTime> analysisPeriod,
                                           List<String> costCategories);

    /**
     * 商家盈利能力分析
     *
     * @param merchantId 商家ID
     * @param analysisPeriod 分析周期
     * @param profitabilityMetrics 盈利能力指标
     * @return 盈利能力分析结果
     */
    Map<String, Object> analyzeProfitability(Long merchantId,
                                            Map<String, LocalDateTime> analysisPeriod,
                                            List<String> profitabilityMetrics);

    /**
     * 商家风险评估
     *
     * @param merchantId 商家ID
     * @param riskFactors 风险因素
     * @param assessmentMethod 评估方法
     * @return 风险评估结果
     */
    Map<String, Object> assessMerchantRisk(Long merchantId,
                                          List<String> riskFactors,
                                          String assessmentMethod);

    /**
     * 商家合规性检查
     *
     * @param merchantId 商家ID
     * @param complianceRules 合规规则
     * @param checkScope 检查范围
     * @return 合规性检查结果
     */
    Map<String, Object> checkMerchantCompliance(Long merchantId,
                                               List<String> complianceRules,
                                               String checkScope);

    /**
     * 商家数据洞察
     *
     * @param merchantId 商家ID
     * @param insightPeriod 洞察周期
     * @param insightDimensions 洞察维度
     * @return 数据洞察结果
     */
    Map<String, Object> getMerchantDataInsights(Long merchantId,
                                               Map<String, LocalDateTime> insightPeriod,
                                               List<String> insightDimensions);

    /**
     * 商家发展趋势预测
     *
     * @param merchantId 商家ID
     * @param predictionPeriod 预测周期
     * @param trendFactors 趋势因素
     * @return 发展趋势预测结果
     */
    Map<String, Object> predictMerchantTrends(Long merchantId,
                                             String predictionPeriod,
                                             List<String> trendFactors);

    /**
     * 商家智能诊断
     *
     * @param merchantId 商家ID
     * @param diagnosticScope 诊断范围
     * @param diagnosticDepth 诊断深度
     * @return 智能诊断结果
     */
    Map<String, Object> intelligentDiagnosis(Long merchantId,
                                            List<String> diagnosticScope,
                                            String diagnosticDepth);

    /**
     * 商家优化建议
     *
     * @param merchantId 商家ID
     * @param optimizationGoals 优化目标
     * @param currentPerformance 当前表现
     * @return 优化建议结果
     */
    List<Map<String, Object>> getMerchantOptimizationSuggestions(Long merchantId,
                                                                List<String> optimizationGoals,
                                                                Map<String, Object> currentPerformance);

    /**
     * 软删除商家信息
     *
     * @param merchantId 商家ID
     * @return 删除结果
     */
    boolean softDeleteMerchant(Long merchantId);

    /**
     * 批量软删除商家信息
     *
     * @param merchantIds 商家ID列表
     * @return 删除结果
     */
    boolean batchSoftDeleteMerchants(List<Long> merchantIds);

    /**
     * 恢复已删除的商家信息
     *
     * @param merchantId 商家ID
     * @return 恢复结果
     */
    boolean restoreMerchant(Long merchantId);

    /**
     * 查询商家操作日志
     *
     * @param merchantId 商家ID
     * @param startTime 查询开始时间
     * @param endTime 查询结束时间
     * @param limit 查询数量限制
     * @return 操作日志列表
     */
    List<Map<String, Object>> getMerchantOperationLogs(Long merchantId,
                                                       LocalDateTime startTime,
                                                       LocalDateTime endTime,
                                                       Integer limit);
}